//Magnus Baunsgaard Kristensen s140168
//Jonathan Yannick Thomassen s125070

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import javax.swing.JFrame;

public class BenytBilletautomat {

  Billetautomat automat = new Billetautomat();

  public static void main(String[] arg) {
    new BenytBilletautomat().start();
  }

  public void start() {
    JFrame konsol = new JFrame("Billetautomat");
    java.util.Scanner tastatur = new java.util.Scanner(System.in);

    double temp_pris = 0;
    String temp_navn, kode, tasteInput;
    int antalBilletter = 0, antalKlippekort = 0, valg = 0;
    boolean ugyldigVærdi;

    do {
      System.out.println();
      System.out.println("Vil du sætte en ny billetautomat op(1) eller læse fra fil(2)?");
      tasteInput = tastatur.nextLine();
      try {
        valg = Integer.parseInt(tasteInput);
      } catch (NumberFormatException e) {
        System.out.println("Ugyldig værdi.");
      }
    } while (!((valg == 1) || (valg == 2)));

    if (valg == 1) {
      do {
        System.out.println();
        System.out.println("Hvad skal administratorkoden være? (Skriv en kode bestående udelukkende af tal)");
        kode = tastatur.nextLine();

        ugyldigVærdi = false;
        if (!kode.equals("demo")) {
          try {
            Integer.parseInt(kode);
          } catch (NumberFormatException e) {
            System.out.println("Ugyldig værdi.");
            ugyldigVærdi = true;
          }
        }
      } while (ugyldigVærdi || kode.charAt(0) == '-');

      if (!kode.equals("demo")) {
        automat.setKodeord(kode);

        do {
          System.out.println();
          System.out.println("Hvor mange typer billetter skal der bruges i automaten? (Maks. 7)");

          tasteInput = tastatur.nextLine();
          ugyldigVærdi = false;
          try {
            antalBilletter = Integer.parseInt(tasteInput);
          } catch (NumberFormatException e) {
            System.out.println("Ugyldig værdi.");
            ugyldigVærdi = true;
          }
        } while (antalBilletter > 7 || antalBilletter < 0 || ugyldigVærdi);

        do {
          System.out.println();
          System.out.println("Hvor mange typer klippekort skal der bruges i automaten? (Maks. 7)");

          tasteInput = tastatur.nextLine();
          ugyldigVærdi = false;
          try {
            antalKlippekort = Integer.parseInt(tasteInput);
          } catch (NumberFormatException e) {
            System.out.println("Ugyldig værdi.\n");
            ugyldigVærdi = true;
          }
        } while (antalKlippekort > 7 || antalKlippekort < 0 || ugyldigVærdi);

        for (int i = antalBilletter; i > 0; i--) {
          do {
            System.out.println();
            System.out.println("Indtast pris for billet nummer " + (antalBilletter - i + 1) + ": (Maks. 9999)");

            tasteInput = tastatur.nextLine();
            ugyldigVærdi = false;
            try {
              temp_pris = Double.parseDouble(tasteInput);
            } catch (NumberFormatException e) {
              System.out.println("Ugyldig værdi.");
              ugyldigVærdi = true;
            }
          } while (temp_pris < 0 || temp_pris > 9999 || ugyldigVærdi);

          do {
            System.out.println("Indtast navn:");
            temp_navn = tastatur.nextLine();
          } while (temp_navn.equals(""));

          automat.nyBillet(temp_pris, temp_navn);
        }

        for (int i = antalKlippekort; i > 0; i--) {
          do {
            System.out.println();
            System.out.println("Indtast pris for klippekort nummer " + (antalKlippekort - i + 1) + ": (Maks. 9999)");

            tasteInput = tastatur.nextLine();
            ugyldigVærdi = false;
            try {
              temp_pris = Double.parseDouble(tasteInput);
            } catch (NumberFormatException e) {
              System.out.println("Ugyldig værdi.");
              ugyldigVærdi = true;
            }
          } while (temp_pris < 0 || temp_pris > 9999 || ugyldigVærdi);

          do {
            System.out.println("Indtast navn:");
            temp_navn = tastatur.nextLine();
          } while (temp_navn.equals(""));

          automat.nytKlippekort(temp_pris, temp_navn);
        }
      } else {
        demo();
      }
    } else if (valg == 2) {
      System.out.println();
      System.out.println("Hvilken fil vil du læse fra?");
      try {
        String filnavn = tastatur.nextLine();
        fraFil(filnavn);
      } catch (IOException e) {
      }
    }
    System.out.println();
    System.out.println("-------------------------------------------");
    konsol.add(new Konsol(automat, konsol));
    konsol.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
    konsol.setLocation(105, 0);
    konsol.setSize(645, 506);
    konsol.setVisible(true);
  }

  public void demo() {
    automat.setKodeord("1234");
    automat.nyBillet(20, "Almindelig");
    automat.nyBillet(40, "Tur/Retur");
    automat.nyBillet(80, "24-timer");
    automat.nytKlippekort(150, "10-turs");
    automat.nytKlippekort(200, "VIP");
    automat.nytKlippekort(100, "Børnekort");
  }

  public void fraFil(String filnavn) throws IOException {
    FileReader fil = new FileReader(filnavn + ".txt");
    BufferedReader ind = new BufferedReader(fil);

    automat.setKodeord(ind.readLine());
    int billetAntal = Integer.parseInt(ind.readLine());
    int klippekortAntal = Integer.parseInt(ind.readLine());

    for (int i = 0; i < billetAntal; i++) {
      automat.nyBillet(Double.parseDouble(ind.readLine()), ind.readLine());
    }

    for (int i = 0; i < klippekortAntal; i++) {
      automat.nytKlippekort(Double.parseDouble(ind.readLine()), ind.readLine());
    }
  }
}
